"""
给你一个二进制数组 nums ，你需要从中删掉一个元素。

请你在删掉元素的结果数组中，返回最长的且只包含 1 的非空子数组的长度。

如果不存在这样的子数组，请返回 0 。

来源：力扣（LeetCode）
链接：https://leetcode-cn.com/problems/longest-subarray-of-1s-after-deleting-one-element
著作权归领扣网络所有。商业转载请联系官方授权，非商业转载请注明出处。
"""

class Solution(object):

    def longestSubarray(self, nums):
        """
        :type nums: List[int]
        :rtype: int
        """

        getMax = lambda x, y: x if x > y else y
        # 只有0
        if nums.__contains__(1) is False:
            return 0
        # 只有1
        if nums.__contains__(0) is False:
            return len(nums) - 1
        else:
            idx_len = {}
            longest_length = 0
            start = 0
            length = 0
            is_new = True
            for idx, i in enumerate(nums):
                if i == 1:
                    if is_new:
                        start = idx
                        is_new = False
                    # 如果是最后一个
                    if idx + 1 == len(nums):
                        idx_len[start] = idx + 1 - start
                # 遇到0
                if i == 0 and is_new is False:
                    length = idx - start
                    idx_len[start] = length
                    is_new = True
                    if length >= longest_length:
                        longest_length = length
        # 找是否有可以拼接的段
        keys = list(enumerate(idx_len.keys()))
        for idx, _ in keys:
            if idx + 1 == len(idx_len):
                return getMax(idx_len[keys[idx][1]], longest_length)
            this_idx = idx
            next_idx = idx + 1
            if keys[next_idx][1] - (keys[this_idx][1] + idx_len[keys[this_idx][1]]) == 1:
                # 可以拼接, 如果更大就更新
                longest_length = getMax(idx_len[keys[this_idx][1]] + idx_len[keys[next_idx][1]], longest_length)
        return longest_length

# print(Solution.longestSubarray(self=None, nums = [1,1,0,1,1,1,0,0,1,1,1,1,1,1]))
# print(Solution.longestSubarray(self=None, nums = [1,1,0,0,1,1,1,0,1]))
# 这是可以accept的解, 但是注意要用py3的环境跑，如果用py2的环境跑，测试用例[1,1,0,0,1,1,1,0,1]结果会是3，是错误的
